/**
 * 
 */
package com.kgcx.common.redis;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Redis缓存配置
 * 注意：这里也可以不用继承CachingConfigurerSupport，也就是直接一个普通的Class就好了；
 * 这里主要我们之后要重新实现 key的生成策略，只要这里修改KeyGenerator，其它位置不用修改就生效了。
 * 普通使用普通类的方式的话，那么在使用@Cacheable的时候还需要指定KeyGenerator的名称;这样编码的时候比较麻烦。
 * 
 * @author 袁进勇
 *
 */
@Configuration
@EnableCaching // 启用缓存，这个注解很重要
public class RedisConfiguration extends CachingConfigurerSupport {
    // @Override
    // @Bean
    // public KeyGenerator keyGenerator() {
    // return new KeyGenerator() {
    // @Override
    // public Object generate(Object target, Method method, Object... params) {
    // StringBuilder sb = new StringBuilder();
    // sb.append(target.getClass().getName());
    // sb.append(method.getName());
    // for (Object obj : params) {
    // sb.append(obj.toString());
    // }
    // return sb.toString();
    // }
    // };
    // }
    //
    // @SuppressWarnings("rawtypes")
    // @Bean
    // public CacheManager cacheManager(RedisTemplate redisTemplate) {
    // RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
    // // 设置缓存过期时间
    // // rcm.setDefaultExpiration(60);//秒
    // return rcm;
    // }

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        return new StringRedisTemplate(factory);
    }

    @Bean
    public <V> JsonRedisTemplate<V> jsonRedisTemplate(RedisConnectionFactory factory) {
        return new JsonRedisTemplate<>(factory);
    }

    @Bean
    public <V> ByteRedisTemplate<V> byteRedisTemplate(RedisConnectionFactory factory) {
        return new ByteRedisTemplate<>(factory);
    }
}
